home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 8174 / 8174.xpi / chrome / antbar.jar / content / downloader / downloadmanager.js < prev   
Text File  |  2009-12-30  |  7KB  |  226 lines

  1. // 
  2. //  downloadmanager.js
  3. //  firefox
  4. //  
  5. //  Created by Zak on 2008-06-17.
  6. //  Contributor Brian King (http://briks.si)
  7. //  Copyright 2008-2009 Ant.com. All rights reserved.
  8. // 
  9.  
  10. var AntDownloadManager =
  11. {
  12.     /**
  13.      * Regex for extracting the filetype from the ContentType
  14.      * /!\ If you change it change the AntPlayer.movieFileMatch RegExp too.
  15.      */
  16.     extFromContentType: /(flv|mp4|asf)/i,
  17.     defaultExtension: 'flv',
  18.  
  19.     /**
  20.      * start
  21.      */
  22.     init: function ()
  23.     {
  24.     },
  25.     
  26.     /**
  27.      * stop 
  28.      */
  29.     destroy: function ()
  30.     {
  31.     },
  32.  
  33.     /**
  34.      * Return the file extention from the contentType
  35.      */
  36.     getExtension: function (contentType)
  37.     {
  38.     var m = contentType.match(this.extFromContentType);
  39.  
  40.     if (m != null)
  41.     {
  42.         return m[1].toLowerCase();
  43.     }
  44.     return this.defaultExtension;
  45.     },
  46.  
  47.     /**
  48.      * return the movies destination folder and create it if it doesn't exist
  49.      */
  50.     getDestFolder: function () 
  51.     {
  52.           var flvdir;
  53.           var file = AntLib.CCIN("@mozilla.org/file/local;1", "nsILocalFile");
  54.         
  55.         try
  56.         {
  57.             flvdir = AntPrefs.flvDir;
  58.             file.initWithPath(flvdir);
  59.             if (!file.exists()) 
  60.                 file.create(AntLib.CI("nsIFile").DIRECTORY_TYPE, 0777);
  61.             if (!file.isDirectory())
  62.             {
  63.                 alert(AntLang.getString("AntDownloadManager.InvalidDestinationFolder"));
  64.                 return null;
  65.             }
  66.         }
  67.         catch (e) { alert(AntLang.getString("AntDownloadManager.NoFlvDir")); }
  68.  
  69.         return file;
  70.     },
  71.  
  72.     /**
  73.      * public function to download a flv from the toolbar
  74.      * @param origin the origin web site where the movie is from ex youtube
  75.      * @param url where the flv is
  76.      * @param name of the video
  77.      * @param doNotOpen if true the function won't open the firefox download manager
  78.      * @return destFile.path if available else false
  79.      */
  80.     downloadFlv: function (flvLink, doNotOpen)
  81.     {
  82.         flvLink.name = AntLib.sanitize(flvLink.name);
  83.         flvLink.origin = AntLib.sanitize(flvLink.origin);
  84.         
  85.         var destFile = this.getDestFolder();
  86.         if (!destFile)
  87.             return false;
  88.  
  89.     var ext = this.getExtension(flvLink.contentType);
  90.  
  91.         destFile.append(flvLink.origin + "." + flvLink.name + "." + ext);
  92.         while (destFile.exists())
  93.         {
  94.             destFile = this.getDestFolder();
  95.             flvLink.incrementFlvName();
  96.             destFile.append(flvLink.origin + "." + flvLink.name + "." + ext);
  97.         }
  98.         destFile.create(AntLib.CI("nsIFile").NORMAL_FILE_TYPE, 0777);
  99.         this.download(flvLink, destFile);
  100.         if (!doNotOpen)
  101.             this.openDownloadWindow();
  102.         return destFile.path;
  103.     },
  104.  
  105.     /**
  106.      * openDownloadWindow opens the firefox downloadManager
  107.      */
  108.     openDownloadWindow: function ()
  109.     {
  110.         AntLib.openWindow("Download:Manager", "chrome://mozapps/content/downloads/downloads.xul", {});
  111.     },
  112.  
  113.  
  114.     /**
  115.      * Checks if the URL is in the cache 
  116.      */
  117.     isInCache: function(url)
  118.     {
  119.     var cacheService = Components.classes['@mozilla.org/network/cache-service;1']
  120.     .getService(Components.interfaces.nsICacheService);
  121.  
  122.     var httpCacheSession = cacheService.createSession("HTTP", Components.interfaces.nsICache.STORE_ANYWHERE, true);
  123.     httpCacheSession.doomEntriesIfExpired = false;
  124.  
  125.     try {
  126.         var cacheEntryDescriptor = httpCacheSession.openCacheEntry(url, Components.interfaces.nsICacheEntryDescriptor, false);
  127.     }
  128.     catch (e)
  129.     {
  130.         if ( e.name == "NS_ERROR_CACHE_WAIT_FOR_VALIDATION" )
  131.         return false;
  132.  
  133.         if ( e.name == "NS_ERROR_CACHE_KEY_NOT_FOUND" )
  134.         return false;
  135.  
  136.         return false;
  137.     }
  138.  
  139.     AntLib.toLog("isInCache returning: " + cacheEntryDescriptor);
  140.     return cacheEntryDescriptor != null;
  141.     },
  142.  
  143.  
  144.     /**
  145.      * low level function to download a flv
  146.      * @param flvlink AntFlvLink object
  147.      * @param dest destination file type nsILocalFile
  148.      */
  149.     download: function (flvlink, dest)
  150.     {
  151.           try
  152.           {
  153.             var ioService = AntLib.CCSV("@mozilla.org/network/io-service;1", "nsIIOService");
  154.             var s_uri = ioService.newURI(flvlink.url, null, null);
  155.             var t_uri = ioService.newFileURI(dest);
  156.             var nsIWBP = AntLib.CI("nsIWebBrowserPersist");
  157.             var browserPersist = AntLib.CCIN('@mozilla.org/embedding/browser/nsWebBrowserPersist;1', "nsIWebBrowserPersist");
  158.             var dlMgr = AntLib.CCSV('@mozilla.org/download-manager;1', "nsIDownloadManager");
  159.         var flags = 
  160.         nsIWBP.PERSIST_FLAGS_NO_CONVERSION | 
  161.         nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
  162.         nsIWBP.PERSIST_FLAGS_CLEANUP_ON_FAILURE;
  163.  
  164.         if ( this.isInCache(flvlink.url) )
  165.         flags |= nsIWBP.PERSIST_FLAGS_FROM_CACHE;
  166.         else
  167.         flags |= nsIWBP.PERSIST_FLAGS_BYPASS_CACHE;
  168.  
  169.             browserPersist.persistFlags = flags;
  170.  
  171.         /**
  172.          * Add the download to the downloader window
  173.          */
  174.             var ret = dlMgr.addDownload(0, s_uri, t_uri, flvlink.name.replace(/_/g, " "), null, null, null, browserPersist, browserPersist);
  175.         //dlMgr.addListener(AntDownloadListener);
  176.             AntPrefs.flvToPlay = dest.path;
  177.             browserPersist.progressListener = ret;
  178.  
  179.         /**
  180.          * Start downloading
  181.          */
  182.             // AntLib.toLog("flvlink.header = " + flvlink.header);
  183.             browserPersist.saveURI(s_uri, null, null, null, flvlink.header, t_uri);
  184.  
  185.             try {
  186.                 AntDownloadManager.sendDownloadInfo(flvlink);
  187.             }
  188.             catch (e) {
  189.                 AntLib.toLog("AntDownloadManager: sendDownloadInfo error: " + e);
  190.             }
  191.           }
  192.           catch (e)
  193.           {
  194.             alert(AntLang.getString("AntDownloadManager.DownloadError"));
  195.             AntLib.toLog("AntDownloadManager: Download error: " + e);
  196.           }
  197.     },
  198.  
  199.     /**
  200.      * Send anonymous download stats
  201.      * @param flvlink AntFlvLink object
  202.      */
  203.     sendDownloadInfo: function (flvlink)
  204.     {
  205.         if (!AntPrefs.canSendStats)
  206.             return;
  207.  
  208.         var body = "url=" + AntLib.uriEncode(gBrowser.selectedBrowser.contentDocument.location.href) +
  209.         "&ref="    + AntLib.uriEncode(gBrowser.selectedBrowser.contentDocument.referrer) +
  210.         "&stream=" + AntLib.uriEncode(flvlink.url) +
  211.         "&type="   + AntLib.uriEncode(flvlink.contentType) +
  212.         "&length=" + AntLib.uriEncode(flvlink.contentLength) +
  213.         "&uid="    + AntLib.uriEncode(AntRankService.UUID);
  214.  
  215.         var httpRequest = new XMLHttpRequest();
  216.  
  217.         httpRequest.open("POST", "http://report.ant.com/download/", true);
  218.         httpRequest.onload = function () { /* Async Query, do nothing with the reply */ };
  219.         httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  220.         httpRequest.send(body);
  221.  
  222.         AntLib.toLog("Sending download report to Ant, data: " + body);
  223.     }
  224.  
  225. }
  226.